// 线型结构（数组、链表、单向链表、双向链表）
// 树（二叉树、平衡二叉树）
// B树、红黑树
// 散列

// 在JS中Map用得比较少，因为大多数情况下对象可以替代他。
/**
 * 和对象的共同点：
 * key-value方式存储数据
 * 不同点：
 * Map的key可以是任意数据类型，对象的Key几乎就是字符串（甚至提倡遵循标识符规则）
 */

// 可以传入一个可遍历对象进行初始化，可遍历对象的成员要求是键值对
let map = new Map([
    ["name","Hydra"],
    ["age",35],
    ["sex","男"],
]);


// set(key,value)：确保一组键值对，返回当前map对象的引用，所以可以链式调用
map.set("sports","football").set("weight",75);
console.log(map);

// get(key)：根据key获取value，如果key上没有对应值，返回undefined
let value = map.get("name");
console.log("value = ",value);

value = map.get("xxx");
console.log("value = ",value); // undefined
// get(key)返回的是undefined，key上没有对应值。 这是一个必要条件。

// has(key)：判断key上是否存在值
map.set("xx",undefined);
console.log(map.has("name")); // true
console.log(map.has("xx")); // true

// delete(key)：根据key删除键值对
console.log(map.delete("name")); // true

// clear()：清空当前Map
map.clear();

// size：获取键值对数量
console.log(map.size);

// Map遍历：key遍历，值遍历，键值对遍历，装载的遍历函数
map.set("a","A").set("b","B").set("c","C");
console.log("-----------keys()遍历--------------")
for (let key of map.keys()) {
    console.log(key,"=",map.get(key));
}

console.log("-----------values()遍历--------------")
for (let value of map.values()) {
    console.log(value);
}

console.log("-----------entries()遍历--------------")
for (let [key,value] of map.entries()) {
    console.log(key,"=",value);
}

// 遍历函数：实际就是entries
console.log(map.entries === map[Symbol.iterator]); // true